Muchas veces los datos que encontramos en la web no están formatos estructurados o ficheros que estamos a acostumbrados a manejar como xls, csv, csv2, txt, json, xml entre otros, es por eso que es necesario desarrollar una metodología diferente para poder acceder a dichos datos.
El web scraping es uno de los métodos más sólidos y confiables para obtener datos de internet y este nos permite extraer datos escondidos en un documento, como páginas web.
Conocer la estructura de una página web es el primer paso para extraer y usar los datos.
HTML es el acrónimo de Hypertext Markup Language y es el lenguaje utilizado para describir (marcado) páginas web y como tal es el lenguaje subyacente para estructurar el contenido de la página web. HTML no determina la apariencia de las cosas, solo ayuda a clasificar y estructurar el contenido.
CSS (hojas de estilo en cascada) es un lenguaje que define la apariencia de un documento escrito en un lenguaje de marcado (por ejemplo, HTML).
JavaScript (JS) es un lenguaje de programación interpretado que es implementado como parte de un navegador web permitiendo mejoras en la interfaz de usuario y páginas web dinámicas
En el siguiente enlace encontrará un listado con las etiquetas básicas html
<div id="about"> (Asignando id.)
<div class="container"> (Asignando clase.)
#about
.container
rvest es un paquete que facilita la recolección de datos de páginas web html creado por Hadley Wickham (científico jefe de RStudio).
install.packages("rvest")
Funciones principales
read_html(url) : para leer el código html html_nodes() : para identificar los nodos html_nodes(“.class”) : llamado a los nodos basado en la clase CSS html_nodes(“#id”): llamado al nodo basado en el id de la etiquetahtml_table(): convierte tablas HTML en dataframe
SelectorGadget es una herramienta de código abierto que nos indica el selector CSS de una sección especifica de una página web, con esto podemos identificar en que clase CSS esta determinado dato.
Una vez añadida la extensión esta aparecerá en la parte superior derecha del navegador.
Para saber cómo funciona, consulte:
A continuación, se muestra como extraer información del rankin de películas de la pagina IMDb
library(rvest)
## Loading required package: xml2
#Especificar la url de la página de la que queremos extraer la información
url <- "https://www.imdb.com/search/title?count=100&release_date=2016,2016&title_type=feature"
# Leyendo el código HTML de la pagina
peliculas <- read_html(url)
# Extrayendo el los nodos que contienen los títulos de las películas.
nodos_titulos <- html_nodes(peliculas, ".lister-item-header a")
# Convirtiendo a texto (siempre)
titulos_peliculas <- html_text(nodos_titulos)
# Mostremos los primeros 5 elementos de titulos_peliculas
head(titulos_peliculas, 5)
## [1] "Moonlight"
## [2] "La La Land"
## [3] "Fantastic Beasts and Where to Find Them"
## [4] "X-Men: Apocalypse"
## [5] "Split"
# Verificamos que si sea el tipo de dato que deseamos
class(titulos_peliculas)
## [1] "character"
#NOTA: podemos usar tuberias (hace exactamente lo mismo que el código de arriba)
titulos_peliculas <- peliculas %>% html_nodes(".lister-item-header a") %>% html_text()
# Extrayendo el los nodos que contienen la descripción de las películas.
nodos_descripcion <- html_nodes(peliculas, '.ratings-bar+ .text-muted')
# Convirtiendo a texto (siempre)
descripcion <- html_text(nodos_descripcion)
# Mostremos los primeros 3 elementos.
head(descripcion, 3)
## [1] "\n A chronicle of the childhood, adolescence and burgeoning adulthood of a young, African-American, gay man growing up in a rough neighborhood of Miami."
## [2] "\n While navigating their careers in Los Angeles, a pianist and an actress fall in love while attempting to reconcile their aspirations for the future."
## [3] "\n The adventures of writer Newt Scamander in New York's secret community of witches and wizards seventy years before Harry Potter reads his book in school."
# Limpiando, removiendo '\n'
descripcion_clean <- gsub("\n","",descripcion )
#Mostremos nuevamente los primeros 3 elementos.
head(descripcion_clean, 3)
## [1] " A chronicle of the childhood, adolescence and burgeoning adulthood of a young, African-American, gay man growing up in a rough neighborhood of Miami."
## [2] " While navigating their careers in Los Angeles, a pianist and an actress fall in love while attempting to reconcile their aspirations for the future."
## [3] " The adventures of writer Newt Scamander in New York's secret community of witches and wizards seventy years before Harry Potter reads his book in school."
# Extrayendo los nodos que contienen la duración de las películas.
nodos_duracion <- html_nodes(peliculas, '.runtime')
# Convirtiendo a texto (siempre)
duracion <- html_text(nodos_duracion)
head(duracion, 3)
## [1] "111 min" "128 min" "133 min"
# Limpiando, removiendo 'min'
duracion_clean <-gsub("min","",duracion )
# Mostrado los primeros 3 elementos
head(duracion_clean, 3)
## [1] "111 " "128 " "133 "
# convirtiendo a tipo de variable deseada
duracion_clean <- as.numeric(duracion_clean)
# Extrayendo los nodos de calificación de las películas
nodos_calificacion <- html_nodes(peliculas, '.ratings-imdb-rating strong')
# Convirtiendo a texto (siempre)
calificacion <- html_text(nodos_calificacion)
# convirtiendo a variable deseada.
calificacion <- as.numeric(calificacion)
datos <- data.frame(titulos_peliculas, descripcion_clean, duracion_clean, calificacion)
library(ggplot2)
ggplot (datos, aes(x = calificacion, y = duracion_clean)) + geom_point()
(en construcción)
Algunos sitios web se oponen a ser rastreados, ya sea por el aumento de las cargas del servidor o por preocupaciones sobre la propiedad de los datos. Si un sitio web prohíbe raspar los Términos de uso, es ilegal.
Extraer datos de twitter : https://rpubs.com/camilamila/tweets2